package com.example.backend.domain.enums;

/**
 * 用户角色枚举
 * 
 * 使用建议：
 * - API响应使用 toLowerCaseString()
 * - 与RoleConstants配合使用保证类型安全
 * - 字符串解析使用 fromString() 或 fromStringSafe()
 */
public enum Role {
    /**
     * 系统管理员 - 拥有所有权限
     */
    ADMIN,
    
    /**
     * 客服人员 - 可以处理工单和客户服务
     */
    AGENT,
    
    /**
     * 客户 - 可以创建工单和查看自己的工单
     */
    CUSTOMER,
    
    /**
     * 客服主管 - 可以管理客服人员和查看统计数据
     */
    SUPERVISOR,
    
    /**
     * 只读用户 - 只能查看数据，不能修改
     */
    READONLY;
    
    /**
     * 获取小写形式的角色名称（用于API响应）
     * @return 小写角色名称
     */
    public String toLowerCaseString() {
        return this.name().toLowerCase();
    }
    
    /**
     * 获取Spring Security格式的角色名称
     * @return ROLE_前缀的角色名称
     */
    public String toRoleString() {
        return "ROLE_" + this.name();
    }
    
    /**
     * 从字符串获取角色枚举（忽略大小写）
     * @param roleName 角色名称
     * @return 对应的角色枚举
     * @throws IllegalArgumentException 如果角色名称无效
     */
    public static Role fromString(String roleName) {
        if (roleName == null || roleName.isEmpty()) {
            throw new IllegalArgumentException("角色名称不能为空");
        }
        try {
            return Role.valueOf(roleName.toUpperCase());
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("无效的角色名称: " + roleName, e);
        }
    }
    
    /**
     * 从字符串安全地获取角色枚举（忽略大小写，失败返回null）
     * @param roleName 角色名称
     * @return 对应的角色枚举，如果无效则返回null
     */
    public static Role fromStringSafe(String roleName) {
        if (roleName == null || roleName.isEmpty()) {
            return null;
        }
        try {
            return Role.valueOf(roleName.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
    
    /**
     * 获取角色的显示名称
     * @return 中文显示名称
     */
    public String getDisplayName() {
        return switch (this) {
            case ADMIN -> "系统管理员";
            case AGENT -> "客服人员";
            case CUSTOMER -> "客户";
            case SUPERVISOR -> "客服主管";
            case READONLY -> "只读用户";
        };
    }
}


